
        <html>
			<head>
			     <title>逆向基础——软件手动脱壳技术入门 - YHZX_2013</title>
				 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
			</head>
			<body>
				<h1>原文地址:<a href="http://drops.wooyun.org/tips/8296">http://drops.wooyun.org/tips/8296</a></h1>
				
      <p>
        <p>这里整合了一下之前自己学习软件手工脱壳的一些笔记和脱文，希望能给新学软件逆向和脱壳的童鞋们一点帮助。</p>

<h1>1 一些概念</h1>

<hr />

<h3>1.1 加壳</h3>

<p>加壳的全称应该是可执行程序资源压缩，是保护文件的常用手段。加壳过的程序可以直接运行，但是不能查看源代码。要经过脱壳才可以查看源代码。</p>

<p>加壳是利用特殊的算法，对<code>EXE</code>、<code>DLL</code>文件里的资源进行压缩、加密。类似<code>WINZIP</code> 的效果，只不过这个压缩之后的文件，可以独立运行，解压过程完全隐蔽，都在内存中完成。它们附加在原程序上通过<code>Windows</code>加载器载入内存后，先于原始程序执行，得到控制权，执行过程中对原始程序进行解密、还原，还原完成后再把控制权交还给原始程序，执行原来的代码部分。加上外壳后，原始程序代码在磁盘文件中一般是以加密后的形式存在的，只在执行时在内存中还原，这样就可以比较有效地防止破解者对程序文件的非法修改，同时也可以防止程序被静态反编译。</p>

<p>壳的类型通常分为压缩壳和加密壳两类。压缩壳的特点是减小软件体积大小，加密保护不是重点。加密壳种类比较多，不同的壳侧重点不同，一些壳单纯保护程序，另一些壳提供额外的功能，如提供注册机制、使用次数、时间限制等。</p>

<!--more-->

<h3>1.2 OEP</h3>

<p>OEP：(<code>Original Entry Point</code>)，程序的入口点。软件加壳一般隐藏了程序真实的<code>OEP</code>（或者用了假的<code>OEP</code>）， 我们需要寻找程序真正的<code>OEP</code>，才可以完成脱壳。</p>

<p>一般加壳程序在使用<code>Ollydbg</code>等动态调试工具时，会停在壳的预处理块。即处在对于程序原始代码块的解压或解密操作之前，在运行完程序自脱壳模块后，会停留在程序加壳之前的<code>OEP</code>位置，此时是<code>dump</code>程序的最佳时期。脱壳时在真实<code>OEP</code>处下<code>int3</code>断点，就可以捕捉到程序代码段完全恢复的状态。因此，寻找加壳程序的正确OEP，也成了手动脱壳时的第一要务。</p>

<h3>1.3 IAT</h3>

<p>IAT：(<code>Import Address Table</code>)，导入地址表。由于导入函数就是被程序调用但其执行代码又不在程序中的函数，这些函数的代码位于一个或者多个<code>DLL</code>中。当<code>PE</code>文件被装入内存的时候，<code>Windows</code>装载器才将<code>DLL</code> 装入，并将调用导入函数的指令和函数实际所处的地址联系起来（动态连接），这操作就需要导入表完成。其中导入地址表就指示函数实际地址。 多数加壳软件在运行时会重建导入地址表，因此获取加壳程序正确的导入地址表也是手动脱壳操作中的一个关键问题。</p>

<h1>2 一些脱壳方法</h1>

<hr />

<h3>2.1单步跟踪法</h3>

<p>单步跟踪法的原理就是通过<code>Ollydbg</code>的单步（<code>F8</code>）、单步进入（<code>F7</code>）和运行到（<code>F4</code>）功能，完整走过程序的自脱壳过程，跳过一些循环恢复代码的片段，并用单步进入确保程序不会略过<code>OEP</code>。这样可以在软件自动脱壳模块运行完毕后，到达<code>OEP</code>，并<code>dump</code>程序。</p>

<h3>2.2 ESP定律法</h3>

<p><code>ESP</code>定律法是脱壳的利器，是应用频率最高的脱壳方法之一。</p>

<p><code>ESP</code>定律的原理在于程序中堆栈平衡的合理利用。由于在程序自解密或者自解压过程中，不少壳会先将当前寄存器内容压栈，如使用<code>pushad</code>，在解压结束后，会将之前的寄存器值出栈，如使用<code>popad</code>。因此在寄存器出栈时，往往程序代码被自动恢复，此时硬件断点触发。然后在程序当前位置，只需要少许单步跟踪，就很容易到达正确的<code>OEP</code>位置。</p>

<h3>2.3内存镜像法（二次断点法）</h3>

<p>内存镜像法是在加壳程序被加载时，通过<code>OD</code>的<code>ALT+M</code>快捷键，进入到程序虚拟内存区段。然后通过加两次内存一次性断点，到达程序正确<code>OEP</code>的位置。</p>

<p>内存镜像法的原理在于对于程序资源段和代码段下断点，一般程序自解压或者自解密时，会首先访问资源段获取所需资源，然后在自动脱壳完成后，转回程序代码段。这时候下内存一次性断点，程序就会停在<code>OEP</code>处。</p>

<h3>2.4一步到达OEP</h3>

<p>所谓的一步到达<code>OEP</code>的脱壳方法，是根据所脱壳的特征，寻找其距离<code>OEP</code>最近的一处汇编指令，然后下<code>int3</code>断点，在程序走到<code>OEP</code>的时候<code>dump</code>程序。 如一些压缩壳往往<code>popad</code>指令距离<code>OEP</code>或者<code>Magic Jump</code>特别近，因此使用<code>Ollydbg</code>的搜索功能，可以搜索壳的特征汇编代码，达到一步断点到达<code>OEP</code>的效果。</p>

<h3>2.5最后一次异常法</h3>

<p>最后一次异常法的原理是，程序在自解压或自解密过程中，可能会触发无数次的异常。如果能定位到最后一次程序异常的位置，可能就会很接近自动脱壳完成位置。现在最后一次异常法脱壳可以利用<code>Ollydbg</code>的异常计数器插件，先记录异常数目，然后重新载入，自动停在最后一次异常处。</p>

<h3>2.6 模拟跟踪法</h3>

<p>模拟跟踪法的原理就是使用<code>Ollydbg</code>下条件断点，<code>SFX</code>相当于是一个自解压段，在自解压段结束时（<code>eip</code>的值转到代码段时），已经距离<code>OEP</code>很近，但是这种跟踪方法会比较耗时。</p>

<h3>2.7 “SFX”法</h3>

<p>“<code>SFX</code>”法利用了<code>Ollydbg</code>自带的<code>OEP</code>寻找功能，可以选择直接让程序停在<code>OD</code>找到的<code>OEP</code>处，此时自解压已经完成，可以直接<code>dump</code>程序。</p>

<h1>3一些脱壳实践</h1>

<hr />

<p>下面给出整理的使用以上方法，自己尝试手动脱这几种常用壳的脱壳笔记。</p>

<h3>3.1UPX脱壳笔记</h3>

<p>首先进行侦壳：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361659418.png" alt="enter image description here" /></p>

<p>首先把程序扔到<code>OllyIce</code>里面可以看到：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361672853.png" alt="enter image description here" /></p>

<p>然后这里尝试使用<code>ESP</code>定理：即在<code>ESP</code>第一次改变时，对<code>ESP</code>的地址设置硬件字访问断点，这样可以在代码被<code>UPX</code>算法还原之后，跳转到程序的正常入口处。</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361649831.png" alt="enter image description here" /></p>

<p>然后<code>F5</code>运行，并没有直接到跳转到程序入口处的大跳位置，但是可以看到<code>UPX</code>的大跳就在眼前：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361797105.png" alt="enter image description here" /></p>

<p>所以被还原后的程序入口点就是<code>0x00445151</code>（通过单步往下走，<code>F4</code>略过往回走的循环语句，也可以看到这个大跳的位置。）接下来走到大跳位置，跳到正常程序入口处：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361719618.png" alt="enter image description here" /></p>

<p>然后去掉硬件断点，并使用<code>LoadPE</code>的<code>dump</code>功能<code>dump</code>目标程序：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361744342.png" alt="enter image description here" /></p>

<p>先修正映像大小，然后再选择完整脱壳，这样可以得到第一步dump的程序，然后再使用<code>ImportREC</code>修复<code>dump</code>程序的<code>OEP</code>，<code>OEP</code>的信息通过<code>OD</code>自带的<code>dump</code>功能查询或者直接填<code>45151</code>：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361761078.png" alt="enter image description here" /></p>

<p>将正确的入口地址填入<code>ImportREC</code>中，然后自动搜索<code>IAT</code>信息：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361733455.png" alt="enter image description here" /></p>

<p>然后点击获取输入表得到修正<code>IAT</code>之后的程序函数输入表，然后再点击显示无效函数，愉快地发现没有无效函数，那么就可以直接修复转存文件了。</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361891042.png" alt="enter image description here" /></p>

<p>选择刚刚第一步<code>dump</code>下来的转储文件进行修复，修复完成之后脱壳完成：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361826005.png" alt="enter image description here" /></p>

<p>这里对于压缩壳<code>UPX</code>，直接使用了<code>ESP</code>定律，可以很方便找到<code>OEP</code>并<code>dump</code>程序。</p>

<h3>4.2 tElock脱壳笔记</h3>

<p>这里脱的是一个<code>tElock</code>的壳：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361884279.png" alt="enter image description here" /></p>

<p>1、先使用最简单的最后一次异常法： 首先把程序扔到<code>OllyIce</code>里面设置<code>OD</code>调试选项中的异常选项，</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361846658.png" alt="enter image description here" /></p>

<p>仅保留内存非法访问异常，然后使用异常计数器插件，在使用前要清空断点设置：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361892003.png" alt="enter image description here" /></p>

<p>等到程序正常运行后，重新加载程序，再选择第二步，停在最后一次异常之前：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361993654.png" alt="enter image description here" /></p>

<p>然后用<code>Alt+M</code>转到内存窗口，对主程序<code>code</code>段下内存断点，<code>SHIFT+F9</code>执行：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361912314.png" alt="enter image description here" /></p>

<p>这样程序就中断在了正确的<code>OEP</code>处，可以选择从模块中删除分析以显示正常分析的汇编代码。然后使用<code>LoadPE dump</code>程序，并修正程序映像大小。但是在使用<code>ImportREC v1.6F Fix</code>版，输入正确的<code>OEP</code>，获取函数输入表信息时，会发现无效的指针。使用方法一修复后，再使用方法三可以完全修复：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361952811.png" alt="enter image description here" /></p>

<p>再点击<code>Fix dump</code>，可以修复之前<code>dump</code>下来的程序，脱壳完成：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607361935413.png" alt="enter image description here" /></p>

<p>2、使用二次内存断点法： 首先载入程序，将所有的异常类型忽略，然后在<code>idata</code>段设置内存断点, 然后<code>SHIFT+F9</code>：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362045034.png" alt="enter image description here" /></p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362042336.png" alt="enter image description here" /></p>

<p>停下来后再次在code段设置内存断点，再次SHIFT+F9执行，可以直接达到正确的OEP中：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362072346.png" alt="enter image description here" /></p>

<p>然后<code>LoadPE dump</code>，然后修复<code>IAT</code>。修复方法同方法1。</p>

<p>3、寻找<code>magic jump</code>以及修复函数表完成后<code>dump</code>程序： 前两步还是加内存断点（<code>idata</code>、<code>code</code>），然后定位到程序的正确<code>OEP</code>处</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362088624.png" alt="enter image description here" /></p>

<p>然后如果这时使用<code>LoadPE dump</code>后修复，就和前两种一样了。这里先是使用<code>ImportREC</code>获取函数输入表第一个位置的指针地址。</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362043022.png" alt="enter image description here" /></p>

<p>然后得到函数指针偏移地址在<code>0x005512C</code>，加上基地址后为<code>0x045512C</code>，这时在该位置下硬件访问双字断点。再重新<code>SHIFT+F9</code>忽略异常执行后，由于下了断点，会触发<code>tElock</code>的<code>CRC</code>校验错误：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362194553.png" alt="enter image description here" /></p>

<p>所以这里要先绕过<code>CRC</code>校验，才能成功执行到硬件断点位置，所以首先暂停程序，然后使用<code>Alt+F9</code>返回用户代码。点击确定按钮后，程序暂停在调用<code>ExitProcess</code>的位置：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362130047.png" alt="enter image description here" /></p>

<p>现在要向上找一找能跳过这个退出的跳转（<code>CRC</code>判断跳转），然后进行修改并跳过：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362162731.png" alt="enter image description here" /></p>

<p>找到了应该修改的位置，但是如果修改之后重新运行是会被恢复的，所以先记下来这个跳转的地址，<code>0x00469622</code>。重新运行之后，在<code>idata</code>断设置内存断点，<code>SHIFT+F9</code>停下后，再<code>Ctrl+G</code>找到修改点再修改。修改完之后再设置之前的硬件断点，这样不会触发<code>CRC</code>校验错误了。</p>

<p>无数次的<code>SHIFT+F9</code>之后，在寄存器窗口可以看到指针以及能够正常显示：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362126126.png" alt="enter image description here" /></p>

<p>然后此时<code>F8</code>单步，找<code>magic jump</code>……看小生大大的视屏是通过分析疑似<code>CRC</code>跳转得到<code>magic jump</code>的位置：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362184384.png" alt="enter image description here" /></p>

<p>这里记下来<code>magic jump</code>的地址是<code>0x0046973B</code>，然后清空<code>udd</code>文件，删除硬件断点，再次重新运行程序，然后在<code>idata</code>下内存断点停住，然后<code>Ctrl+G</code>找到<code>magic jump</code>位置处，修改跳转：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362299203.png" alt="enter image description here" /></p>

<p>然后在<code>code</code>段下内存断点：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362296199.png" alt="enter image description here" /></p>

<p>然后<code>SHIFT+F9</code>执行，停下来就到了<code>OEP</code>的位置：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362215164.png" alt="enter image description here" /></p>

<p>这时候再<code>dump</code>程序，<code>IAT</code>表已经被修复，可以直接获得脱壳版程序：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362227615.png" alt="enter image description here" /></p>

<p>这里尝试使用了另外两种脱壳方法，并且通过预先找<code>OEP</code>的方式，修复了<code>CRC</code>校验后，直接<code>dump</code>到了<code>IAT</code>被修复了的程序。</p>

<h3>3.3 PEncrypt脱壳笔记</h3>

<p>首先进行侦壳：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362255617.png" alt="enter image description here" /></p>

<p>先把程序扔到<code>OllyIce</code>里面，然后程序停在这里，看起来蛮怪的：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362378017.png" alt="enter image description here" /></p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362367447.png" alt="enter image description here" /> 好吧，重新加载程序，尝试使用最后一次异常法，不忽略所有异常，然后使用异常计数器插件，程序停在最后一次异常处：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362352723.png" alt="enter image description here" /></p>

<p>如果此时<code>F8</code>单步下去，程序会触发异常处理，然后又到不了<code>OEP</code>了。这时需要看一下堆栈数据情况：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362387635.png" alt="enter image description here" /></p>

<p>这时需要在<code>0040CCD7</code>处<code>F2</code>下断点，然后<code>SHIFT+F9</code>执行，可以跳过这个坑：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362411789.png" alt="enter image description here" /></p>

<p>然后接下来就是<code>F8+F4</code>的操作，一路直到<code>OEP</code>：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362413802.png" alt="enter image description here" /></p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362421091.png" alt="enter image description here" /></p>

<p>用<code>LoadPE</code>脱壳，然后用<code>ImportREC</code>修复后，虽然没有无效指针，但是还是不能运行：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362492831.png" alt="enter image description here" /></p>

<p>这时候用<code>LoadPE</code>的重建<code>PE</code>功能：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362429807.png" alt="enter image description here" /></p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362595370.png" alt="enter image description here" /></p>

<p>然后就可以正常运行了：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362539490.png" alt="enter image description here" /></p>

<p>这个壳使用了单步跟踪的脱壳方法，一路跳过程序“陷阱”，最后达到<code>OEP</code>。并且使用了<code>LoadPE</code>的重建<code>PE</code>功能，对程序进行了重建，最终完成了这个加密壳的脱壳全过程。</p>

<h3>3.4 FSG变形壳脱壳笔记</h3>

<p>首先进行侦壳：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362521810.png" alt="enter image description here" /></p>

<p>使用<code>ESP</code>定律，首先把程序扔到<code>OllyIce</code>里面，<code>F8</code>单步走，观察<code>ESP</code>变化，在<code>ESP</code>第一次发生变化时，对<code>ESP</code>对应的地址处设置内存硬件访问<code>WORD</code>断点，然后<code>SHIFT+F9</code>运行，在程序停下来之后，取消硬件断点，进行<code>F8</code>单步：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362589025.png" alt="enter image description here" /></p>

<p>用<code>F4</code>略过向后的跳转（循环），然后继续往下找，一直到这里：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362541805.png" alt="enter image description here" /></p>

<p>在这个<code>jmp</code>下面<code>F4</code>，程序会跑飞。说明程序代码在这个循环中就已经释放完毕，所以向上找找这个循环中有没有带条件的大跳。这样很容易找到<code>magic jump</code>的位置，然后我们<code>Enter</code>或者<code>Ctrl+G</code>到<code>00402666</code>的位置，发现果然是<code>OEP</code>，重新分析，然后<code>F2</code>下断点，让程序走到<code>OEP</code>：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362664622.png" alt="enter image description here" /></p>

<p>如果是<code>FSG1.33</code>，直接使用<code>LoadPE dump</code>文件，然后使用<code>ImportREC</code>修复，就可以正常脱壳了。但是这里在使用<code>ImportREC</code>修复时，会出现一个无效指针：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362624439.png" alt="enter image description here" /></p>

<p>这里直接剪掉（或者删掉）这个指针，然后修复转存文件，发现无法正常打开：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362676840.png" alt="enter image description here" /></p>

<p>然后再把修复后的程序，丢到<code>OllyIce</code>中<code>F9</code>直接运行：</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362696958.png" alt="enter image description here" /></p>

<p>这里是变形壳添加的一个暗桩，会导致程序出现异常退出，这里直接<code>nop</code>掉或者把之前的<code>jle</code>（校验）改成<code>jmp</code>，然后保存修改另存文件。然后就可以运行了</p>

<p><img src="http://static.wooyun.org//drops/20150906/2015090607362686786.png" alt="enter image description here" /></p>

<h1>4 参考</h1>

<p>【百度百科（各种概念）、自己之前的脱文……】 另附一篇脱壳步骤汇总： <a href="http://www.52pojie.cn/thread-259984-1-1.html">http://www.52pojie.cn/thread-259984-1-1.html</a></p>      </p>
    
			</body>
		</html>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          